package dao.impl;

import dao.InterventionDao;
import dao.dto.AdresseDto;
import dao.dto.ClientParticulierDto;
import dao.dto.InterventionDto;
import dao.dto.ZoneDto;
import boerrors.InterventionExistantException;
import boerrors.InterventionInexistantException;
import dao.dto.CodePostalDto;
import dao.dto.PrioriteDto;
import dao.dto.RoleDto;
import dao.dto.StatutDto;
import dao.dto.TechnicienDto;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.GregorianCalendar;
import java.util.Vector;

public class InterventionDaoImpl extends InterventionDao {
        private static InterventionDao _instance = null;
        private CallableStatement _callableStatement = null;
        private SQLConnection _connection = new SQLConnection();
        
        //Constructeur du singleton
	public static InterventionDao getInstance(){
		if(_instance == null)
			_instance = new InterventionDaoImpl();
		return _instance;
	}
        
        //Methodes
        // Créer une demande d'intervention
	@Override
	public int enregistrer(InterventionDto intervention) throws InterventionExistantException {
            try {
                    System.out.println("DEBUG: Entrer dans la DAL pour création d'une demande");
                    //query
                    _callableStatement = _connection.getConnection().prepareCall("{? = call sp_DemandeCreerInsert(?,?,?,?,?,?,?,?)}");
                    // valeur de retour (id)                   
                    _callableStatement.registerOutParameter(1, java.sql.Types.INTEGER);
                    //parameter
                    _callableStatement.setInt("clientFK",intervention.getClient().getIdClient());
                    _callableStatement.setInt("idAdresse",intervention.getAdresse().getIdAdresse());                       
                    _callableStatement.setString("rue",intervention.getAdresse().getRue());
                    _callableStatement.setString("numero",intervention.getAdresse().getNumero());
                    _callableStatement.setInt("CodePostalFK",intervention.getAdresse().getCodePostal().getIdCodePostal());
                    _callableStatement.setDate("dateDemande",new Date(intervention.getDateDemande().getTime().getTime()));
                    _callableStatement.setString("descDemande",intervention.getDescriptionDemande());
                    _callableStatement.setString("prioriteDemandeFK",intervention.getPrioriteDemande().getPriorite());                        
                    //execute
                    _callableStatement.executeUpdate();    
                    
                    return _callableStatement.getInt(1);
            } catch(SQLException e) {
                if (e.getMessage().equals("547")) {
                    throw new InterventionExistantException("Client / Code postal / Adresse / Priorité Incorrect (FK)",e);
                } else if (e.getMessage().equals("515")) {
                    throw new InterventionExistantException("Non autorisé champs vide",e);
                } else  throw new InterventionExistantException(e);
            } catch(Exception e){
                throw new InterventionExistantException(e);
            } finally {
                    if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionExistantException(e);}
                    _connection.deconnecter();
            }
        }
        // planifier la demande d'intervention pour la première fois
        @Override
	public void planifier(InterventionDto intervention) throws InterventionInexistantException {
            try {
                    //query
                    _callableStatement = _connection.getConnection().prepareCall("{call sp_PlanificationPlanifierInsert(?,?,?,?)}");
                    //parameter
                    _callableStatement.setInt("idDemandeFK",intervention.getIdIntervention());
                    _callableStatement.setDate("dateIntervention",new Date(intervention.getDateIntervention().getTime().getTime()));
                    _callableStatement.setInt("technicienFK",intervention.getTechnicien().getMatricule());
                    _callableStatement.setString("prioriteInterventionFK",intervention.getPrioriteIntervention().getPriorite());                        
                    //execute
                    _callableStatement.executeUpdate();    
            } catch(SQLException e) {
                if (e.getMessage().equals("547")) {
                    throw new InterventionInexistantException("Intervention  / Technicien / Priorité incorrect (FK)",e);
                } else if (e.getMessage().equals("515")) {
                    throw new InterventionInexistantException("Non autorisé champs vide",e);
                } else if (e.getMessage().equals("50001")) {
                    throw new InterventionInexistantException("L'intervention a déjà été planifiée",e);
                } else if (e.getMessage().equals("50002")) {
                    throw new InterventionInexistantException("Un employé ne peut être planifier à une intervention",e);
                } else  throw new InterventionInexistantException(e);
            } catch(Exception e){
                throw new InterventionInexistantException(e);
            } finally {
                    if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
        }
        
        // le technicien traite l'intervention à son arrivé chez le client (encours)
        @Override
        public void traiter(InterventionDto intervention) throws InterventionInexistantException {
            try {
                    System.out.println("DEBUG: Entrer dans la DAL pour la traiter");
                    //query
                    _callableStatement = _connection.getConnection().prepareCall("{call sp_InterventionEncoursInsert(?,?)}");
                    //parameter
                    _callableStatement.setInt("idPlanificationFK",intervention.getIdIntervention());
                    _callableStatement.setTimestamp("heureDebut",new Timestamp(intervention.getHeureDebut().getTime().getTime()));
                    //execute
                    _callableStatement.executeUpdate();    
            } catch(SQLException e) {
                if (e.getMessage().equals("547")) {
                    throw new InterventionInexistantException("Intervention incorrect (FK)",e);
                } else if (e.getMessage().equals("515")) {
                    throw new InterventionInexistantException("Non autorisé champs vide",e);
                } else if (e.getMessage().equals("50001")) {
                    throw new InterventionInexistantException("L'intervention est déjà encours",e);
                } else  throw new InterventionInexistantException(e);
            } catch(Exception e){
                throw new InterventionInexistantException(e);
            } finally {
                    if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
        }
        
        // cloture une intervention (après avoir été mis sur encours)
        @Override
        public void cloturer(InterventionDto intervention) throws InterventionInexistantException {
            try {
                    System.out.println("DEBUG: Entrer dans la DAL pour la cloturer");
                    //query
                    _callableStatement = _connection.getConnection().prepareCall("{call sp_InterventionCloturerInsertDelete(?,?,?)}");
                    //parameter
                    _callableStatement.setInt("idInterventionFK",intervention.getIdIntervention());
                    _callableStatement.setTimestamp("heureFin",new Timestamp(intervention.getHeureFin().getTime().getTime()));
                    _callableStatement.setString("descIntervention",intervention.getDescriptionIntervention());
                    //execute
                    _callableStatement.executeUpdate();    
            } catch(SQLException e) {
                if (e.getMessage().equals("547")) {
                    throw new InterventionInexistantException("Client / Code postal / Adresse /Intervention  / Technicien / Priorité incorrect (FK)",e);
                } else if (e.getMessage().equals("515")) {
                    throw new InterventionInexistantException("Non autorisé champs vide",e);
                } else if (e.getMessage().equals("50001")) {
                    throw new InterventionInexistantException("L'intervention n'a pas commencé",e);
                } else  throw new InterventionInexistantException(e);
            } catch(Exception e){
                throw new InterventionInexistantException(e);
            } finally {
                    if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
        }
        
        // Annule une demande d'intervention (seulement non planifié ou planifié ou déplanifié)
        @Override
        public void annuler(InterventionDto intervention) throws InterventionInexistantException {
            try {
                    System.out.println("DEBUG: Entrer dans la DAL pour annuler");
                    //query
                    _callableStatement = _connection.getConnection().prepareCall("{call sp_DemandePlanificationAnnulerInsertDelete(?)}");
                    //parameter
                    _callableStatement.setInt("idInterventionFK",intervention.getIdIntervention());
                    //execute
                    _callableStatement.executeUpdate();    
            } catch(SQLException e) {
                if (e.getMessage().equals("547")) {
                    throw new InterventionInexistantException("Client / Code postal / Adresse /Intervention  / Technicien / Priorité incorrect (FK)",e);
                } else if (e.getMessage().equals("515")) {
                    throw new InterventionInexistantException("Non autorisé champs vide",e);
                } else if (e.getMessage().equals("50001")) {
                    throw new InterventionInexistantException("Impossible d'annuler car l'intervention n'existe pas",e);
                } else if (e.getMessage().equals("50002")) {
                    throw new InterventionInexistantException("Impossible d'annuler car l'intervention a commencé",e);
                } else  throw new InterventionInexistantException(e);
            } catch(Exception e){
                throw new InterventionInexistantException(e);
            } finally {
                    if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
        }
        
        // Deplanifier une intervention planifié mais pas encours
        @Override
        public void deplanifier(InterventionDto intervention) throws InterventionInexistantException {
            try {
                    System.out.println("DEBUG: Entrer dans la DAL pour deplanifier");
                    //query
                    _callableStatement = _connection.getConnection().prepareCall("{call sp_PlanificationDeplanifierUpdate(?)}");
                    //parameter
                    _callableStatement.setInt("idDemandeFK",intervention.getIdIntervention());
                    //execute
                    _callableStatement.executeUpdate();    
            } catch(SQLException e) {
                if (e.getMessage().equals("50001")) {
                    throw new InterventionInexistantException("la planification n'existe pas",e);
                }else if (e.getMessage().equals("50002")) {
                    throw new InterventionInexistantException("Impossible de deplanifier, l'intervention a commencé",e);    
                } else  throw new InterventionInexistantException(e);
            } catch(Exception e){
                throw new InterventionInexistantException(e);
            } finally {
                    if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
        }
        
        // Replanifier une intervention planifié mais pas encours
        @Override
        public void replanifier(InterventionDto intervention) throws InterventionInexistantException {
            try {
                    System.out.println("DEBUG: Entrer dans la DAL pour Replanifier");
                    //query
                    _callableStatement = _connection.getConnection().prepareCall("{call sp_PlanificationReplanifierUpdate(?,?,?)}");
                    //parameter
                    _callableStatement.setInt("idDemandeFK",intervention.getIdIntervention());
                    _callableStatement.setDate("dateIntervention",new Date(intervention.getDateIntervention().getTime().getTime()));
                    _callableStatement.setInt("technicienFK",intervention.getTechnicien().getMatricule());
                    //execute
                    _callableStatement.executeUpdate();    
            } catch(SQLException e) {
                if (e.getMessage().equals("50001")) {
                    throw new InterventionInexistantException("la planification n'existe pas",e);
                }else if (e.getMessage().equals("50002")) {
                    throw new InterventionInexistantException("Impossible de Replanifier, l'intervention a commencé",e);    
                } else  throw new InterventionInexistantException(e);
            } catch(Exception e){
                throw new InterventionInexistantException(e);
            } finally {
                    if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
        }
        
        // suivi et créer une demande intervention 
        @Override
        public int suivi(InterventionDto ancienIntervention,InterventionDto nouvelleIntervention) throws InterventionInexistantException {
            try {
                    System.out.println("DEBUG: Entrer dans la DAL pour la suivi");
                    //query
                    _callableStatement = _connection.getConnection().prepareCall("{? = call sp_InterventionSuiviInsertDelete(?,?,?,?,?)}");
                    // valeur de retour (id)                   
                    _callableStatement.registerOutParameter(1, java.sql.Types.INTEGER);
                    //parameter
                    _callableStatement.setInt("idInterventionFK",ancienIntervention.getIdIntervention());
                    _callableStatement.setTimestamp("heureFin",new Timestamp(ancienIntervention.getHeureFin().getTime().getTime()));
                    _callableStatement.setString("descIntervention",ancienIntervention.getDescriptionIntervention());
                    _callableStatement.setString("descDemande",nouvelleIntervention.getDescriptionDemande());
                    _callableStatement.setString("prioriteDemandeFK",nouvelleIntervention.getPrioriteDemande().getPriorite());
                    //execute
                    _callableStatement.executeUpdate();    
                    return _callableStatement.getInt(1);
            } catch(SQLException e) {
                if (e.getMessage().equals("547")) {
                    throw new InterventionInexistantException("Client / Code postal / Adresse /Intervention  / Technicien / Priorité incorrect (FK)",e);
                } else if (e.getMessage().equals("515")) {
                    throw new InterventionInexistantException("Non autorisé champs vide",e);
                } else if (e.getMessage().equals("50001")) {
                    throw new InterventionInexistantException("L'intervention n'a pas commencé",e);
                } else  throw new InterventionInexistantException(e);
            } catch(Exception e){
                throw new InterventionInexistantException(e);
            } finally {
                    if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
        }
    // lister les interventions ouvertes    
    @Override
    public Vector<InterventionDto> lister() throws InterventionInexistantException {
        ResultSet resultat = null;
        InterventionDto intervention= null;
        // Client
        ZoneDto zoneCL = null;
        CodePostalDto codePostalCL = null;
        AdresseDto adresseCL = null;
        ClientParticulierDto client = null;
        // prioriteDemande
        PrioriteDto prioriteDemande = null;
        //Adresse Demande
        ZoneDto zoneDE = null;
        CodePostalDto codePostalDE = null;
        AdresseDto adresseDE = null;
        // Technicien
        RoleDto roleTE = null;
        ZoneDto zoneTE = null;
        ZoneDto zoneTEadr = null;
        CodePostalDto codePostalTE = null;
        AdresseDto adresseTE = null;
        TechnicienDto technicien = null;
        // prioriteIntervention
        PrioriteDto prioriteIntervention = null;
        
        StatutDto statut= null;
            try {                                      
                //query
                _callableStatement = _connection.getConnection().prepareCall("{call sp_InterventionOuverteList}");    
                //execute
                resultat = _callableStatement.executeQuery();
                
                Vector<InterventionDto> liste = new Vector<InterventionDto>();
                while (resultat.next()) {
                    // init
                    GregorianCalendar dateDemande=new GregorianCalendar();
                    GregorianCalendar dateIntervention=null;
                    GregorianCalendar heureDebut=null;
                    
                    // demande créer
                    // Client
                    zoneCL = new ZoneDto( resultat.getInt("idZoneClient"),
                                        resultat.getString("libZoneClient"));
                    codePostalCL = new CodePostalDto( resultat.getInt("idCodePostalClient"),
                                                    resultat.getString("cpClient"),
                                                    resultat.getString("villeClient"),
                                                    resultat.getString("libPaysClient"),
                                                    zoneCL);
                    adresseCL = new AdresseDto(   resultat.getInt("idAdresseClient"),
                                                resultat.getString("rueClient"),
                                                resultat.getString("numeroClient"),
                                                codePostalCL
                                                );
                    client = new ClientParticulierDto(  resultat.getInt("idClient"),
                                                        resultat.getString("nomClient"),
                                                        resultat.getString("prenomClient"),
                                                        adresseCL,
                                                        resultat.getString("telephoneClient"),
                                                        resultat.getString("emailClient")
                                                        );
                    prioriteDemande = new PrioriteDto(resultat.getString("prioriteDemandeFK"));
                    // adresse demande
                    zoneDE = new ZoneDto( resultat.getInt("idZoneDemande"),
                            resultat.getString("libZoneDemande"));
                    codePostalDE = new CodePostalDto( resultat.getInt("idCodePostalDemande"),
                                        resultat.getString("cpDemande"),
                                        resultat.getString("villeDemande"),
                                        resultat.getString("libPaysDemande"),
                                        zoneDE);
                    adresseDE = new AdresseDto(   resultat.getInt("idAdresseDemande"),
                                    resultat.getString("rueDemande"),
                                    resultat.getString("numeroDemande"),
                                    codePostalDE
                                    );
                    // date demande
                    dateDemande.setTime(resultat.getTimestamp("dateDemande"));
                    
                    // planifier ou deplanifier
                    if (resultat.getString("statut").contentEquals("PL") || resultat.getString("statut").contentEquals("DE")|| resultat.getString("statut").contentEquals("EN")) {
                        dateIntervention=new GregorianCalendar();
                        dateIntervention.setTime(resultat.getTimestamp("dateIntervention"));    
                        if (resultat.getString("statut").contentEquals("PL") || resultat.getString("statut").contentEquals("EN")) {
                            // technicien
                            roleTE = new RoleDto( resultat.getInt("idRoles")
                                                ,resultat.getBoolean("gestionClient"),resultat.getBoolean("gestionDirection")
                                                ,resultat.getBoolean("gestionIntervention"), resultat.getBoolean("gestionOnSite")
                                                ,resultat.getBoolean("gestionPlanning"), resultat.getBoolean("gestionSysteme"));
                            zoneTE = new ZoneDto( resultat.getInt("idZoneTechnicien"),
                                                resultat.getString("libZoneTechnicien"));
                            zoneTEadr = new ZoneDto( resultat.getInt("idZoneTechnicienAdr"),
                                                resultat.getString("libZoneTechnicienAdr"));
                            codePostalTE = new CodePostalDto( resultat.getInt("idCodePostalTechnicien"),
                                                            resultat.getString("cpTechnicien"),
                                                            resultat.getString("villeTechnicien"),
                                                            resultat.getString("libPaysTechnicien"),
                                                            zoneTEadr);
                            adresseTE = new AdresseDto(   resultat.getInt("idAdresseTechnicien"),
                                                        resultat.getString("rueTechnicien"),
                                                        resultat.getString("numeroTechnicien"),
                                                        codePostalTE
                                                        );
                            technicien = new TechnicienDto(  resultat.getInt("idRHMatricule")
                                                                ,resultat.getString("nomTechnicien")
                                                                ,resultat.getString("prenomTechnicien")
                                                                ,adresseTE
                                                                ,resultat.getString("telephoneTechnicien")
                                                                ,resultat.getString("emailTechnicien")
                                                                ,resultat.getString("fonctionTechnicien")
                                                                ,resultat.getString("passwordTechnicien")
                                                                ,roleTE, zoneTE);
                        }
                        prioriteIntervention = new PrioriteDto(resultat.getString("prioriteInterventionFK"));
                        // encours
                        if (resultat.getString("statut").contentEquals("EN")) {
                            heureDebut=new GregorianCalendar();
                            heureDebut.setTime(resultat.getTimestamp("heureDebut"));    
                        }
                    }
                                     

                    statut=new StatutDto(resultat.getString("statut"));
                    
                    intervention = new InterventionDto(resultat.getInt("idDemande"), client, adresseDE
                                                        , dateDemande, resultat.getString("descDemande"), prioriteDemande
                                                        , dateIntervention, technicien, prioriteIntervention
                                                        , heureDebut
                                                        , statut, resultat.getInt("parentFK")
                                                        );
                                                
                    liste.add(intervention);
                }
                return liste;
            } catch(SQLException e) { 
                throw new InterventionInexistantException(e);
            } finally { 
                if (resultat != null) try { resultat.close(); } catch(Exception e) { throw new InterventionInexistantException(e);}
                if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
    }
    
    @Override
    public Vector<InterventionDto> rechercherHistorique(ClientParticulierDto client) throws InterventionInexistantException {
        ResultSet resultat = null;
        InterventionDto intervention= null;
        // Client
        ZoneDto zoneCL = null;
        CodePostalDto codePostalCL = null;
        AdresseDto adresseCL = null;
        ClientParticulierDto clientTmp = null;
        // prioriteDemande
        PrioriteDto prioriteDemande = null;
        //Adresse Demande
        ZoneDto zoneDE = null;
        CodePostalDto codePostalDE = null;
        AdresseDto adresseDE = null;
        // Technicien
        RoleDto roleTE = null;
        ZoneDto zoneTE = null;
        ZoneDto zoneTEadr = null;
        CodePostalDto codePostalTE = null;
        AdresseDto adresseTE = null;
        TechnicienDto technicien = null;
        // prioriteIntervention
        PrioriteDto prioriteIntervention = null;
        
        StatutDto statut= null;
            try {                                      
                //query
                _callableStatement = _connection.getConnection().prepareCall("{call sp_InterventionHistoriqueClientSearchBy(?)}");    
                //parameter
               _callableStatement.setInt("clientFK",client.getIdClient());
                //execute
                resultat = _callableStatement.executeQuery();
                
                Vector<InterventionDto> liste = new Vector<InterventionDto>();
                while (resultat.next()) {
                    // init
                    GregorianCalendar dateDemande=new GregorianCalendar();
                    GregorianCalendar dateIntervention=null;
                    GregorianCalendar heureDebut=null;
                    GregorianCalendar heureFin=null;
                    String descriptionIntervention=null;
                    
                    // demande créer
                    // Client
                    zoneCL = new ZoneDto( resultat.getInt("idZoneClient"),
                                        resultat.getString("libZoneClient"));
                    codePostalCL = new CodePostalDto( resultat.getInt("idCodePostalClient"),
                                                    resultat.getString("cpClient"),
                                                    resultat.getString("villeClient"),
                                                    resultat.getString("libPaysClient"),
                                                    zoneCL);
                    adresseCL = new AdresseDto(   resultat.getInt("idAdresseClient"),
                                                resultat.getString("rueClient"),
                                                resultat.getString("numeroClient"),
                                                codePostalCL
                                                );
                    clientTmp = new ClientParticulierDto(  resultat.getInt("idClient"),
                                                        resultat.getString("nomClient"),
                                                        resultat.getString("prenomClient"),
                                                        adresseCL,
                                                        resultat.getString("telephoneClient"),
                                                        resultat.getString("emailClient")
                                                        );
                    prioriteDemande = new PrioriteDto(resultat.getString("prioriteDemandeFK"));
                    // adresse demande
                    zoneDE = new ZoneDto( resultat.getInt("idZoneDemande"),
                            resultat.getString("libZoneDemande"));
                    codePostalDE = new CodePostalDto( resultat.getInt("idCodePostalDemande"),
                                        resultat.getString("cpDemande"),
                                        resultat.getString("villeDemande"),
                                        resultat.getString("libPaysDemande"),
                                        zoneDE);
                    adresseDE = new AdresseDto(   resultat.getInt("idAdresseDemande"),
                                    resultat.getString("rueDemande"),
                                    resultat.getString("numeroDemande"),
                                    codePostalDE
                                    );
                    // date demande
                    dateDemande.setTime(resultat.getTimestamp("dateDemande"));
                    
                    if (resultat.getTimestamp("dateIntervention")!=null) {                      
                        dateIntervention=new GregorianCalendar();
                        dateIntervention.setTime(resultat.getTimestamp("dateIntervention"));    
                        prioriteIntervention = new PrioriteDto(resultat.getString("prioriteInterventionFK"));
                    }
                        // technicien
                        if (resultat.getInt("idRHMatricule")!=0) {
                            // technicien
                            roleTE = new RoleDto( resultat.getInt("idRoles")
                                                ,resultat.getBoolean("gestionClient"),resultat.getBoolean("gestionDirection")
                                                ,resultat.getBoolean("gestionIntervention"), resultat.getBoolean("gestionOnSite")
                                                ,resultat.getBoolean("gestionPlanning"), resultat.getBoolean("gestionSysteme"));
                            zoneTE = new ZoneDto( resultat.getInt("idZoneTechnicien"),
                                                resultat.getString("libZoneTechnicien"));
                            zoneTEadr = new ZoneDto( resultat.getInt("idZoneTechnicienAdr"),
                                                resultat.getString("libZoneTechnicienAdr"));
                            codePostalTE = new CodePostalDto( resultat.getInt("idCodePostalTechnicien"),
                                                            resultat.getString("cpTechnicien"),
                                                            resultat.getString("villeTechnicien"),
                                                            resultat.getString("libPaysTechnicien"),
                                                            zoneTEadr);
                            adresseTE = new AdresseDto(   resultat.getInt("idAdresseTechnicien"),
                                                        resultat.getString("rueTechnicien"),
                                                        resultat.getString("numeroTechnicien"),
                                                        codePostalTE
                                                        );
                            technicien = new TechnicienDto(  resultat.getInt("idRHMatricule")
                                                                ,resultat.getString("nomTechnicien")
                                                                ,resultat.getString("prenomTechnicien")
                                                                ,adresseTE
                                                                ,resultat.getString("telephoneTechnicien")
                                                                ,resultat.getString("emailTechnicien")
                                                                ,resultat.getString("fonctionTechnicien")
                                                                ,resultat.getString("passwordTechnicien")
                                                                ,roleTE, zoneTE);
                        }
                                     
                    // si pas annuler
                    if (!resultat.getString("statut").contentEquals("AN")) {
                        //en cours
                        heureDebut=new GregorianCalendar();
                        heureDebut.setTime(resultat.getTimestamp("heureDebut"));    
                    }
                    
                    // si cloturer
                    if (resultat.getTimestamp("heureFin")!=null) {                      
                        heureFin=new GregorianCalendar();
                        heureFin.setTime(resultat.getTimestamp("heureFin"));    
                        descriptionIntervention = resultat.getString("descIntervention");
                    }
                    
                    
                    statut=new StatutDto(resultat.getString("statut"));
                    
                    intervention = new InterventionDto(resultat.getInt("idInterventionH"), clientTmp, adresseDE
                                                        , dateDemande, resultat.getString("descDemande"), prioriteDemande
                                                        , dateIntervention, technicien, prioriteIntervention
                                                        , heureDebut,heureFin,descriptionIntervention
                                                        , statut, resultat.getInt("parentFK")
                                                        );
                    intervention.setEnfant(resultat.getInt("enfantFK"));                            
                    liste.add(intervention);
                }
                return liste;
            } catch(SQLException e) { 
                throw new InterventionInexistantException(e);
            } finally { 
                if (resultat != null) try { resultat.close(); } catch(Exception e) { throw new InterventionInexistantException(e);}
                if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
    }
    
    
    // lister historique
    @Override
    public Vector<InterventionDto> listerHistorique() throws InterventionInexistantException {
        ResultSet resultat = null;
        InterventionDto intervention= null;
        // Client
        ZoneDto zoneCL = null;
        CodePostalDto codePostalCL = null;
        AdresseDto adresseCL = null;
        ClientParticulierDto clientTmp = null;
        // prioriteDemande
        PrioriteDto prioriteDemande = null;
        //Adresse Demande
        ZoneDto zoneDE = null;
        CodePostalDto codePostalDE = null;
        AdresseDto adresseDE = null;
        // Technicien
        RoleDto roleTE = null;
        ZoneDto zoneTE = null;
        ZoneDto zoneTEadr = null;
        CodePostalDto codePostalTE = null;
        AdresseDto adresseTE = null;
        TechnicienDto technicien = null;
        // prioriteIntervention
        PrioriteDto prioriteIntervention = null;
        
        StatutDto statut= null;
            try {                                      
                //query
                _callableStatement = _connection.getConnection().prepareCall("{call sp_InterventionHistoriqueList}");    
                //execute
                resultat = _callableStatement.executeQuery();
                
                Vector<InterventionDto> liste = new Vector<InterventionDto>();
                while (resultat.next()) {
                    // init
                    GregorianCalendar dateDemande=new GregorianCalendar();
                    GregorianCalendar dateIntervention=null;
                    GregorianCalendar heureDebut=null;
                    GregorianCalendar heureFin=null;
                    String descriptionIntervention=null;
                    
                    // demande créer
                    // Client
                    zoneCL = new ZoneDto( resultat.getInt("idZoneClient"),
                                        resultat.getString("libZoneClient"));
                    codePostalCL = new CodePostalDto( resultat.getInt("idCodePostalClient"),
                                                    resultat.getString("cpClient"),
                                                    resultat.getString("villeClient"),
                                                    resultat.getString("libPaysClient"),
                                                    zoneCL);
                    adresseCL = new AdresseDto(   resultat.getInt("idAdresseClient"),
                                                resultat.getString("rueClient"),
                                                resultat.getString("numeroClient"),
                                                codePostalCL
                                                );
                    clientTmp = new ClientParticulierDto(  resultat.getInt("idClient"),
                                                        resultat.getString("nomClient"),
                                                        resultat.getString("prenomClient"),
                                                        adresseCL,
                                                        resultat.getString("telephoneClient"),
                                                        resultat.getString("emailClient")
                                                        );
                    prioriteDemande = new PrioriteDto(resultat.getString("prioriteDemandeFK"));
                    // adresse demande
                    zoneDE = new ZoneDto( resultat.getInt("idZoneDemande"),
                            resultat.getString("libZoneDemande"));
                    codePostalDE = new CodePostalDto( resultat.getInt("idCodePostalDemande"),
                                        resultat.getString("cpDemande"),
                                        resultat.getString("villeDemande"),
                                        resultat.getString("libPaysDemande"),
                                        zoneDE);
                    adresseDE = new AdresseDto(   resultat.getInt("idAdresseDemande"),
                                    resultat.getString("rueDemande"),
                                    resultat.getString("numeroDemande"),
                                    codePostalDE
                                    );
                    // date demande
                    dateDemande.setTime(resultat.getTimestamp("dateDemande"));
                    if (resultat.getTimestamp("dateIntervention")!=null) {                      
                        dateIntervention=new GregorianCalendar();
                        dateIntervention.setTime(resultat.getTimestamp("dateIntervention"));    
                        prioriteIntervention = new PrioriteDto(resultat.getString("prioriteInterventionFK"));
                    }
                        // technicien
                        if (resultat.getInt("idRHMatricule")!=0) {
                            // technicien
                            roleTE = new RoleDto( resultat.getInt("idRoles")
                                                ,resultat.getBoolean("gestionClient"),resultat.getBoolean("gestionDirection")
                                                ,resultat.getBoolean("gestionIntervention"), resultat.getBoolean("gestionOnSite")
                                                ,resultat.getBoolean("gestionPlanning"), resultat.getBoolean("gestionSysteme"));
                            zoneTE = new ZoneDto( resultat.getInt("idZoneTechnicien"),
                                                resultat.getString("libZoneTechnicien"));
                            zoneTEadr = new ZoneDto( resultat.getInt("idZoneTechnicienAdr"),
                                                resultat.getString("libZoneTechnicienAdr"));
                            codePostalTE = new CodePostalDto( resultat.getInt("idCodePostalTechnicien"),
                                                            resultat.getString("cpTechnicien"),
                                                            resultat.getString("villeTechnicien"),
                                                            resultat.getString("libPaysTechnicien"),
                                                            zoneTEadr);
                            adresseTE = new AdresseDto(   resultat.getInt("idAdresseTechnicien"),
                                                        resultat.getString("rueTechnicien"),
                                                        resultat.getString("numeroTechnicien"),
                                                        codePostalTE
                                                        );
                            technicien = new TechnicienDto(  resultat.getInt("idRHMatricule")
                                                                ,resultat.getString("nomTechnicien")
                                                                ,resultat.getString("prenomTechnicien")
                                                                ,adresseTE
                                                                ,resultat.getString("telephoneTechnicien")
                                                                ,resultat.getString("emailTechnicien")
                                                                ,resultat.getString("fonctionTechnicien")
                                                                ,resultat.getString("passwordTechnicien")
                                                                ,roleTE, zoneTE);
                        }
                                     
                    // si pas annuler
                    if (!resultat.getString("statut").contentEquals("AN")) {
                        heureDebut=new GregorianCalendar();
                        heureDebut.setTime(resultat.getTimestamp("heureDebut"));    
                    }
                    // si cloturer
                    if (resultat.getTimestamp("heureFin")!=null) {                      
                        heureFin=new GregorianCalendar();
                        heureFin.setTime(resultat.getTimestamp("heureFin"));    
                        descriptionIntervention = resultat.getString("descIntervention");
                    }
                    statut=new StatutDto(resultat.getString("statut"));
                    
                    intervention = new InterventionDto(resultat.getInt("idInterventionH"), clientTmp, adresseDE
                                                        , dateDemande, resultat.getString("descDemande"), prioriteDemande
                                                        , dateIntervention, technicien, prioriteIntervention
                                                       , heureDebut,heureFin,descriptionIntervention
                                                        , statut, resultat.getInt("parentFK")
                                                        );
                    intervention.setEnfant(resultat.getInt("enfantFK"));
                    liste.add(intervention);
                }
                return liste;
            } catch(SQLException e) { 
                throw new InterventionInexistantException(e);
            } finally { 
                if (resultat != null) try { resultat.close(); } catch(Exception e) { throw new InterventionInexistantException(e);}
                if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
    }
       
    @Override
    public InterventionDto selectHistoriqueId(int idIntervention) throws InterventionInexistantException {
        ResultSet resultat = null;
        InterventionDto intervention= null;
        // Client
        ZoneDto zoneCL = null;
        CodePostalDto codePostalCL = null;
        AdresseDto adresseCL = null;
        ClientParticulierDto clientTmp = null;
        // prioriteDemande
        PrioriteDto prioriteDemande = null;
        //Adresse Demande
        ZoneDto zoneDE = null;
        CodePostalDto codePostalDE = null;
        AdresseDto adresseDE = null;
        // Technicien
        RoleDto roleTE = null;
        ZoneDto zoneTE = null;
        ZoneDto zoneTEadr = null;
        CodePostalDto codePostalTE = null;
        AdresseDto adresseTE = null;
        TechnicienDto technicien = null;
        // prioriteIntervention
        PrioriteDto prioriteIntervention = null;
        
        StatutDto statut= null;
            try {                                      
                //query
                _callableStatement = _connection.getConnection().prepareCall("{call sp_InterventionHistoriqueSelectId(?)}");    
                //parameter
               _callableStatement.setInt("idInterventionH",idIntervention);
                //execute
                resultat = _callableStatement.executeQuery();
                
                if (resultat.next()) {
                    // init
                    GregorianCalendar dateDemande=new GregorianCalendar();
                    GregorianCalendar dateIntervention=null;
                    GregorianCalendar heureDebut=null;
                    GregorianCalendar heureFin=null;
                    String descriptionIntervention=null;
                    
                    // demande créer
                    // Client
                    zoneCL = new ZoneDto( resultat.getInt("idZoneClient"),
                                        resultat.getString("libZoneClient"));
                    codePostalCL = new CodePostalDto( resultat.getInt("idCodePostalClient"),
                                                    resultat.getString("cpClient"),
                                                    resultat.getString("villeClient"),
                                                    resultat.getString("libPaysClient"),
                                                    zoneCL);
                    adresseCL = new AdresseDto(   resultat.getInt("idAdresseClient"),
                                                resultat.getString("rueClient"),
                                                resultat.getString("numeroClient"),
                                                codePostalCL
                                                );
                    clientTmp = new ClientParticulierDto(  resultat.getInt("idClient"),
                                                        resultat.getString("nomClient"),
                                                        resultat.getString("prenomClient"),
                                                        adresseCL,
                                                        resultat.getString("telephoneClient"),
                                                        resultat.getString("emailClient")
                                                        );
                    prioriteDemande = new PrioriteDto(resultat.getString("prioriteDemandeFK"));
                    // adresse demande
                    zoneDE = new ZoneDto( resultat.getInt("idZoneDemande"),
                            resultat.getString("libZoneDemande"));
                    codePostalDE = new CodePostalDto( resultat.getInt("idCodePostalDemande"),
                                        resultat.getString("cpDemande"),
                                        resultat.getString("villeDemande"),
                                        resultat.getString("libPaysDemande"),
                                        zoneDE);
                    adresseDE = new AdresseDto(   resultat.getInt("idAdresseDemande"),
                                    resultat.getString("rueDemande"),
                                    resultat.getString("numeroDemande"),
                                    codePostalDE
                                    );
                    // date demande
                    dateDemande.setTime(resultat.getTimestamp("dateDemande"));
                    if (resultat.getTimestamp("dateIntervention")!=null) {                      
                        dateIntervention=new GregorianCalendar();
                        dateIntervention.setTime(resultat.getTimestamp("dateIntervention"));    
                        prioriteIntervention = new PrioriteDto(resultat.getString("prioriteInterventionFK"));
                    }
                        // technicien
                        if (resultat.getInt("idRHMatricule")!=0) {
                            // technicien
                            roleTE = new RoleDto( resultat.getInt("idRoles")
                                                ,resultat.getBoolean("gestionClient"),resultat.getBoolean("gestionDirection")
                                                ,resultat.getBoolean("gestionIntervention"), resultat.getBoolean("gestionOnSite")
                                                ,resultat.getBoolean("gestionPlanning"), resultat.getBoolean("gestionSysteme"));
                            zoneTE = new ZoneDto( resultat.getInt("idZoneTechnicien"),
                                                resultat.getString("libZoneTechnicien"));
                            zoneTEadr = new ZoneDto( resultat.getInt("idZoneTechnicienAdr"),
                                                resultat.getString("libZoneTechnicienAdr"));
                            codePostalTE = new CodePostalDto( resultat.getInt("idCodePostalTechnicien"),
                                                            resultat.getString("cpTechnicien"),
                                                            resultat.getString("villeTechnicien"),
                                                            resultat.getString("libPaysTechnicien"),
                                                            zoneTEadr);
                            adresseTE = new AdresseDto(   resultat.getInt("idAdresseTechnicien"),
                                                        resultat.getString("rueTechnicien"),
                                                        resultat.getString("numeroTechnicien"),
                                                        codePostalTE
                                                        );
                            technicien = new TechnicienDto(  resultat.getInt("idRHMatricule")
                                                                ,resultat.getString("nomTechnicien")
                                                                ,resultat.getString("prenomTechnicien")
                                                                ,adresseTE
                                                                ,resultat.getString("telephoneTechnicien")
                                                                ,resultat.getString("emailTechnicien")
                                                                ,resultat.getString("fonctionTechnicien")
                                                                ,resultat.getString("passwordTechnicien")
                                                                ,roleTE, zoneTE);
                        }
                                     
                    // si pas annuler
                    if (!resultat.getString("statut").contentEquals("AN")) {
                        heureDebut=new GregorianCalendar();
                        heureDebut.setTime(resultat.getTimestamp("heureDebut"));    
                    }
                    // si cloturer
                    if (resultat.getTimestamp("heureFin")!=null) {                      
                        heureFin=new GregorianCalendar();
                        heureFin.setTime(resultat.getTimestamp("heureFin"));    
                        descriptionIntervention = resultat.getString("descIntervention");
                    }
                    
                    statut=new StatutDto(resultat.getString("statut"));
                    
                    intervention = new InterventionDto(resultat.getInt("idInterventionH"), clientTmp, adresseDE
                                                        , dateDemande, resultat.getString("descDemande"), prioriteDemande
                                                        , dateIntervention, technicien, prioriteIntervention
                                                       , heureDebut,heureFin,descriptionIntervention
                                                        , statut, resultat.getInt("parentFK")
                                                        );
                    intervention.setEnfant(resultat.getInt("enfantFK"));
                }
                return intervention;                            
            } catch(SQLException e) { 
                throw new InterventionInexistantException(e);
            } finally { 
                if (resultat != null) try { resultat.close(); } catch(Exception e) { throw new InterventionInexistantException(e);}
                if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
    }
    
    
        // modifier une demande d'intervention si pas planifier ou déplanifier
	@Override
	public void modifier(InterventionDto intervention) throws InterventionInexistantException {
            try {
                    System.out.println("DEBUG: Entrer dans la DAL pour modification d'une demande");
                    //query
                    _callableStatement = _connection.getConnection().prepareCall("{call sp_DemandeCreerUpdate(?,?,?,?,?,?,?,?)}");
                    //parameter
                    _callableStatement.setInt("idDemande",intervention.getIdIntervention());
                    _callableStatement.setInt("clientFK",intervention.getClient().getIdClient());
                    _callableStatement.setInt("idAdresse",intervention.getAdresse().getIdAdresse());                       
                    _callableStatement.setString("rue",intervention.getAdresse().getRue());
                    _callableStatement.setString("numero",intervention.getAdresse().getNumero());
                    _callableStatement.setInt("CodePostalFK",intervention.getAdresse().getCodePostal().getIdCodePostal());
                    _callableStatement.setString("descDemande",intervention.getDescriptionDemande());
                    _callableStatement.setString("prioriteDemandeFK",intervention.getPrioriteDemande().getPriorite());                        
                    //execute
                    _callableStatement.executeUpdate();    
                    
            } catch(SQLException e) {
                if (e.getMessage().equals("547")) {
                    throw new InterventionInexistantException("Client / Code postal / Adresse / Priorité Incorrect (FK)",e);
                } else if (e.getMessage().equals("515")) {
                    throw new InterventionInexistantException("Non autorisé champs vide",e);
                } else if (e.getMessage().equals("50001")) {
                    throw new InterventionInexistantException("La demande d'intervention n'existe pas",e);
                } else if (e.getMessage().equals("50002")) {
                    throw new InterventionInexistantException("Impossible de modifier: la demande d'intervention est déjà planifiée",e);
                } else  throw new InterventionInexistantException(e);
            } catch(Exception e){
                throw new InterventionInexistantException(e);
            } finally {
                    if (_callableStatement != null) try { _callableStatement.close(); } catch(Exception e) {throw new InterventionInexistantException(e);}
                    _connection.deconnecter();
            }
        }
        
}